0 - Load A1 and A2
First, Load the previous assignment.
1 - Dataset recap:
The dataset I used was GSE120200.
Brief Description:
Wild type human neurons were cultured that had the ASXL1 gene knocked out. Using various experiments, including injecting the neurons into chicken embryos, the knockout was shown to interfere with neural crest formation.
Legend: (From paper)
Scheme illustrating the generation of human pluripotent stem cell lines carrying premature stop codon (PSC) mutations in ASXL1.
Scheme of human ASXL1 protein showing annotated domains (NR, nuclear receptor), and locations of mutations frequently reported in BOS patients (red tinted sector) and present in BOS-iPSC and ASXL1PSC/PSC/ASXL1PSC/+ hESC clones.
Expression of ASXL1 in BOS-iPSC lines and ASXL1PSC/PSC/ASXL1PSC/+ hESC clones relative to the respective iPSC/hESC control lines using primers targeting exon 4 (mean ± SEM, n ≥ 3 different clones/passages).
Sequences of reverse transcribed ASXL1 transcripts from ASXL1 mutant lines.
(and F) Representative blotting (n = 3–5 independent experiments) of ASXL1, using a monoclonal antibody raised against the N terminus, in an hESC line overexpressing a truncated ASXL1 variant (PB-ASXL1PSC) (E) and in human iPSC and hESC lines (F).
This figure (Matheus et al., 2019) shows how the cell lines were generated. Essentially it compares the expression and transcripts of the cultured cell model with those of patients with Bohring-Opitz Syndrome and the control, specifically with regards to ASXL1. We can see that the cultured cell model looks similar in results to that of the BOS patients and dissimilar from the control.
Previously:
We discarded low counts below 3 and applied TMM normalization to the dataset. We made an MDS plot that showed that WT clusters with WT and HOM clusters with other HOM, so our simple model of is WT or not suffices as a reasonable model. We looked at a mean-variance plot and noticed that the data corresponds closely with the negative binomial line. Hence, we used edgeR which uses negative binomial models with glmQFTest for the final list of results.
2 - Create ranked gene list for GSEA
#corrected_g_gn holds our gene list so pull hgnc_symbol and rank and use that
write.table(x=corrected_g_gn[,c("hgnc_symbol", "rank")],
file="ASXL1_gsea_list.rnk",sep = "\t",
row.names = FALSE,col.names = FALSE,quote = FALSE)
We then feed this result to GSEA and run it. I used GSEA 4.0.3. The geneset I used was from Bader lab, Human_GOBP_AllPathways_no_GO_iea_March_01_2020.
GSEA Results
GSEA seems to have results that are extremely similar to that of the thresholded list, except instead of separate categories for each data source they are all combined together in one list, compared to g:profiler. Some categories are moved up and down, but if I go looking for specific categories in one list I will find it somewhere in the other results list. This is not a straightforward comparison because g:profiler has separated categories while GSEA combines them together, likely due to geneset used, so overall ranking will be skewed due to the combined lists.
GSEA Top upregulated gene list details
head(read.table(file="./a3_figures/gseatopPos.txt",sep = "\t"))
3: Cytoscape Enrichment Map
An enrichment map was created in Cytoscape 3.7.2 using the Cytoscape extension EnrichmentMap3.30Beta (latest release on github as of 04/06/2020) as well as the EnrichmentMap Pipeline Collection 1.1.0 (latest version installable from Cytoscape as of 04/06/2020).
The map was created using the interface within Cytoscape, not from GSEA. Settings were left at default. FDR cutoff: 0.1 p-value cutoff: 1.0 NES: All Not filtering by minimum experiments baderlab names parsed Data Set Edges Automatic Cutoff: 0.375 Metric: Jaccard + Overlap combined, ratio 50/50
There were 490 nodes and 1941 edges.
The network was annotated using the Cytoscape extension AutoAnnotate 1.3.2
Settings were left mostly at default. Using clusterMaker App algorithm: MCL Cluster edge weight column: similarity_coefficient +Layout network to prevent cluster overlap
Label column: GS_DESCR Label Algorithm: WordCloud: Adjacent Words (default) Max words per label: 3 Adjacent word bonus: 8 Excluded Words and Delimiters default
Do the enrichment results support conclusions or mechanism discussed in the original paper? How do these results differ from the results you got from Assignment #2 thresholded methods?
The GSEA results kind of support the conclusions and/or mechanism discussed in the original paper. Although not in the top results, gene lists relating to neural development and differentiation (neural crest differentiation, hedgehog signalling) were found in the downregulated gene list similar to that in the thresholded list approach. We also see stuff vaguely related to mobility and cell division downregulated in the enrichment map (mitotic, movement, etc), which would support that part of neural crest differentiation is formation of neurospheres and migration. Meanwhile the upregulated list shows things such as rrna transcripts, stuff related to mitochondria and the electron transport chain, and immune response, which seems like things that a cell remaining in interphase would prioritize.
4: Dark matter analysis:
#heatmap for any significant genes that are not annotated to any of the pathways returned in the enrichment analysis
heatmap_matrix_tophits <- t(
scale(t(final_a1_data[which(rownames(final_a1_data) %in% ranked_gene_no_enr_annotation[,1]),])))
if(min(heatmap_matrix_tophits) == 0){
heatmap_col = colorRamp2(c( 0, max(heatmap_matrix_tophits)),
c( "white", "red"))
} else {
heatmap_col = colorRamp2(c(min(heatmap_matrix_tophits), 0, max(heatmap_matrix_tophits)), c("blue", "white", "red"))
}
current_heatmap <- Heatmap(as.matrix(heatmap_matrix_tophits),
cluster_rows = TRUE,
cluster_columns = TRUE,
show_row_dend = TRUE,
show_column_dend = TRUE,
col=heatmap_col,
show_column_names = TRUE,
show_row_names = FALSE,
show_heatmap_legend = TRUE,
)
current_heatmap

#heatmap of any significant genes that are not annotated to any pathways in entire set of pathways used for the analysis.
heatmap_matrix_tophits <- t(
scale(t(final_a1_data[which(rownames(final_a1_data) %in% ranked_gene_no_annotation[,1]),])))
if(min(heatmap_matrix_tophits) == 0){
heatmap_col = colorRamp2(c( 0, max(heatmap_matrix_tophits)),
c( "white", "red"))
} else {
heatmap_col = colorRamp2(c(min(heatmap_matrix_tophits), 0, max(heatmap_matrix_tophits)), c("blue", "white", "red"))
}
current_heatmap <- Heatmap(as.matrix(heatmap_matrix_tophits),
cluster_rows = TRUE,
cluster_columns = TRUE,
show_row_dend = TRUE,
show_column_dend = TRUE,
col=heatmap_col,
show_column_names = TRUE,
show_row_names = FALSE,
show_heatmap_legend = TRUE,
)
current_heatmap

Strangely in the dark matter heatmaps WT 2 does not cluster with WT3 and WT1, but they also don’t particularly cluster well with the HOM group as well. Certainly the dark matter has more noise than the genes represented in the gene sets.
References
Davis, S., & Meltzer, P. (2007). GEOquery: A bridge between the gene expression omnibus (geo) and bioconductor. Bioinformatics, 14, 1846–1847.
Durinck, S., Moreau, Y., Kasprzyk, A., Davis, S., De Moor, B., Brazma, A., & Huber, W. (2005). BioMart and bioconductor: A powerful link between biological databases and microarray data analysis. Bioinformatics, 21, 3439–3440.
Durinck, S., Spellman, P. T., Birney, E., & Huber, W. (2009). Mapping identifiers for the integration of genomic datasets with the r/bioconductor package biomaRt. Nature Protocols, 4, 1184–1191.
Gu, Z., Eils, R., & Schlesner, M. (2016). Complex heatmaps reveal patterns and correlations in multidimensional genomic data. Bioinformatics.
Gu, Z., Gu, L., Eils, R., Schlesner, M., & Brors, B. (2014). Circlize implements and enhances circular visualization in r. Bioinformatics, 30(19), 2811–2812.
Kucera, M., Isserlin, R., Arkhangorodsky, A., & Bader, G. D. (2016). AutoAnnotate: A cytoscape app for summarizing networks with semantic annotations. F1000Research, 5.
Matheus, F., Rusha, E., Rehimi, R., Molitor, L., Pertek, A., Modic, M., Feederle, R., Flatley, A., Kremmer, E., Geerlof, A., & others. (2019). Pathological asxl1 mutations and protein variants impair neural crest development. Stem Cell Reports, 12(5), 861–868.
McCarthy, D. J., Chen, Y., & Smyth, G. K. (2012). Differential expression analysis of multifactor rna-seq experiments with respect to biological variation. Nucleic Acids Research, 40(10), 4288–4297. https://doi.org/10.1093/nar/gks042
Merico, D., Isserlin, R., Stueker, O., Emili, A., & Bader, G. D. (2010). Enrichment map: A network-based method for gene-set enrichment visualization and interpretation. PloS One, 5(11).
R Core Team. (2019). R: A language and environment for statistical computing. R Foundation for Statistical Computing. https://www.R-project.org/
Reimand, J., Isserlin, R., Voisin, V., Kucera, M., Tannus-Lopes, C., Rostamianfar, A., Wadi, L., Meyer, M., Wong, J., Xu, C., & others. (2019). Pathway enrichment analysis and visualization of omics data using g: Profiler, gsea, cytoscape and enrichmentmap. Nature Protocols, 14(2), 482–517.
Robinson, M. D., McCarthy, D. J., & Smyth, G. K. (2010). EdgeR: A bioconductor package for differential expression analysis of digital gene expression data. Bioinformatics, 26(1), 139–140. https://doi.org/10.1093/bioinformatics/btp616
Shannon, P., Markiel, A., Ozier, O., Baliga, N. S., Wang, J. T., Ramage, D., Amin, N., Schwikowski, B., & Ideker, T. (2003). Cytoscape: A software environment for integrated models of biomolecular interaction networks. Genome Research, 13(11), 2498–2504.
LS0tDQp0aXRsZTogIkFzc2lnbm1lbnQgMyBOb3RlYm9vayINCmF1dGhvcjogWWkgRmVpIEh1YW5nDQpkYXRlOiAiMjAyMC0wNC0wOCINCmJpYmxpb2dyYXBoeTogQTNjaXRhdGlvbnMuYmliDQpjc2w6ICJhcGEuY3NsIg0Kbm9jaXRlOiB8DQogIEBlZGdlUl8xLCBAZWRnZVJfMiwgQGJpb21hUnRfMSwgQGJpb21hUnRfMiwgQGdlb3F1ZXJ5LCBAUl9jb3JlLCBAY2lyY2xpemUsIEBjb21wbGV4SGVhdG1hcCwgQEdTQSwgQEdTRUEsIEBjeXRvc2NhcGUsIEBlbnJpY2htZW50bWFwLCBAYXV0b2Fubm90YXRlLCBAcGlwZWxpbmUNCm91dHB1dDoNCiAgaHRtbF9ub3RlYm9vazoNCiAgICB0b2M6IFRSVUUNCiAgICB0b2NfZGVwdGg6IDQNCi0tLQ0KDQojIyMjIDAgLSBMb2FkIEExIGFuZCBBMg0KDQpGaXJzdCwgTG9hZCB0aGUgcHJldmlvdXMgYXNzaWdubWVudC4NCg0KYGBge1IgaW5jbHVkZT1GQUxTRSwgZXZhbD1UUlVFfQ0Ka25pdHI6OmtuaXQoIkEyX1lpRmVpSHVhbmcucm1kIikNCmBgYA0KDQojIyMjIDEgLSBEYXRhc2V0IHJlY2FwOg0KDQpUaGUgZGF0YXNldCBJIHVzZWQgd2FzIEdTRTEyMDIwMC4NCg0KIyMjIyMgQnJpZWYgRGVzY3JpcHRpb246DQoNCldpbGQgdHlwZSBodW1hbiBuZXVyb25zIHdlcmUgY3VsdHVyZWQgdGhhdCBoYWQgdGhlIEFTWEwxIGdlbmUga25vY2tlZCBvdXQuIFVzaW5nIHZhcmlvdXMgZXhwZXJpbWVudHMsIGluY2x1ZGluZyBpbmplY3RpbmcgdGhlIG5ldXJvbnMgaW50byBjaGlja2VuIGVtYnJ5b3MsIHRoZSBrbm9ja291dCB3YXMgc2hvd24gdG8gaW50ZXJmZXJlIHdpdGggbmV1cmFsIGNyZXN0IGZvcm1hdGlvbi4NCg0KIyMjIyMgRmlndXJlIGZyb20gdGhlIHBhcGVyOg0KIVtGaWd1cmUgMTogSG93IGNlbGwgbGluZXMgZm9yIFJOQS1zZXEgZGF0YSB3ZXJlIHNvdXJjZWQgYW5kIGNvbmZpcm1lZCB0byBiZSBhIHByb3BlciBtb2RlbF0oLi9hMl9maWd1cmVzL3BhcGVyRmlndXJlLmpwZykNCg0KIyMjIyMgTGVnZW5kOiAoRnJvbSBwYXBlcikNCihBKSBTY2hlbWUgaWxsdXN0cmF0aW5nIHRoZSBnZW5lcmF0aW9uIG9mIGh1bWFuIHBsdXJpcG90ZW50IHN0ZW0gY2VsbCBsaW5lcyBjYXJyeWluZyBwcmVtYXR1cmUgc3RvcCBjb2RvbiAoUFNDKSBtdXRhdGlvbnMgaW4gQVNYTDEuDQoNCihCKSBTY2hlbWUgb2YgaHVtYW4gQVNYTDEgcHJvdGVpbiBzaG93aW5nIGFubm90YXRlZCBkb21haW5zIChOUiwgbnVjbGVhciByZWNlcHRvciksIGFuZCBsb2NhdGlvbnMgb2YgbXV0YXRpb25zIGZyZXF1ZW50bHkgcmVwb3J0ZWQgaW4gQk9TIHBhdGllbnRzIChyZWQgdGludGVkIHNlY3RvcikgYW5kIHByZXNlbnQgaW4gQk9TLWlQU0MgYW5kIEFTWEwxUFNDL1BTQy9BU1hMMVBTQy8rIGhFU0MgY2xvbmVzLg0KDQooQykgRXhwcmVzc2lvbiBvZiBBU1hMMSBpbiBCT1MtaVBTQyBsaW5lcyBhbmQgQVNYTDFQU0MvUFNDL0FTWEwxUFNDLysgaEVTQyBjbG9uZXMgcmVsYXRpdmUgdG8gdGhlIHJlc3BlY3RpdmUgaVBTQy9oRVNDIGNvbnRyb2wgbGluZXMgdXNpbmcgcHJpbWVycyB0YXJnZXRpbmcgZXhvbiA0IChtZWFuIMKxIFNFTSwgbiDiiaUgMyBkaWZmZXJlbnQgY2xvbmVzL3Bhc3NhZ2VzKS4NCg0KKEQpIFNlcXVlbmNlcyBvZiByZXZlcnNlIHRyYW5zY3JpYmVkIEFTWEwxIHRyYW5zY3JpcHRzIGZyb20gQVNYTDEgbXV0YW50IGxpbmVzLg0KDQooRSkgKGFuZCBGKSBSZXByZXNlbnRhdGl2ZSBibG90dGluZyAobiA9IDPigJM1IGluZGVwZW5kZW50IGV4cGVyaW1lbnRzKSBvZiBBU1hMMSwgdXNpbmcgYSBtb25vY2xvbmFsIGFudGlib2R5IHJhaXNlZCBhZ2FpbnN0IHRoZSBOIHRlcm1pbnVzLCBpbiBhbiBoRVNDIGxpbmUgb3ZlcmV4cHJlc3NpbmcgYSB0cnVuY2F0ZWQgQVNYTDEgdmFyaWFudCAoUEItQVNYTDFQU0MpIChFKSBhbmQgaW4gaHVtYW4gaVBTQyBhbmQgaEVTQyBsaW5lcyAoRikuDQoNClRoaXMgZmlndXJlIFtAZGF0YXNldF9wYXBlcl0gc2hvd3MgaG93IHRoZSBjZWxsIGxpbmVzIHdlcmUgZ2VuZXJhdGVkLiBFc3NlbnRpYWxseSBpdCBjb21wYXJlcyB0aGUgZXhwcmVzc2lvbiBhbmQgdHJhbnNjcmlwdHMgb2YgdGhlIGN1bHR1cmVkIGNlbGwgbW9kZWwgd2l0aCB0aG9zZSBvZiBwYXRpZW50cyB3aXRoIEJvaHJpbmctT3BpdHogU3luZHJvbWUgYW5kIHRoZSBjb250cm9sLCBzcGVjaWZpY2FsbHkgd2l0aCByZWdhcmRzIHRvIEFTWEwxLiBXZSBjYW4gc2VlIHRoYXQgdGhlIGN1bHR1cmVkIGNlbGwgbW9kZWwgbG9va3Mgc2ltaWxhciBpbiByZXN1bHRzIHRvIHRoYXQgb2YgdGhlIEJPUyBwYXRpZW50cyBhbmQgZGlzc2ltaWxhciBmcm9tIHRoZSBjb250cm9sLg0KDQojIyMjIyMgUHJldmlvdXNseToNCg0KV2UgZGlzY2FyZGVkIGxvdyBjb3VudHMgYmVsb3cgMyBhbmQgYXBwbGllZCBUTU0gbm9ybWFsaXphdGlvbiB0byB0aGUgZGF0YXNldC4gV2UgbWFkZSBhbiBNRFMgcGxvdCB0aGF0IHNob3dlZCB0aGF0IFdUIGNsdXN0ZXJzIHdpdGggV1QgYW5kIEhPTSBjbHVzdGVycyB3aXRoIG90aGVyIEhPTSwgc28gb3VyIHNpbXBsZSBtb2RlbCBvZiBpcyBXVCBvciBub3Qgc3VmZmljZXMgYXMgYSByZWFzb25hYmxlIG1vZGVsLiBXZSBsb29rZWQgYXQgYSBtZWFuLXZhcmlhbmNlIHBsb3QgYW5kIG5vdGljZWQgdGhhdCB0aGUgZGF0YSBjb3JyZXNwb25kcyBjbG9zZWx5IHdpdGggdGhlIG5lZ2F0aXZlIGJpbm9taWFsIGxpbmUuDQpIZW5jZSwgd2UgdXNlZCBlZGdlUiB3aGljaCB1c2VzIG5lZ2F0aXZlIGJpbm9taWFsIG1vZGVscyB3aXRoIGdsbVFGVGVzdCBmb3IgdGhlIGZpbmFsIGxpc3Qgb2YgcmVzdWx0cy4NCg0KDQojIyMjIDIgLSBDcmVhdGUgcmFua2VkIGdlbmUgbGlzdCBmb3IgR1NFQQ0KDQpgYGB7Un0NCiNjb3JyZWN0ZWRfZ19nbiBob2xkcyBvdXIgZ2VuZSBsaXN0IHNvIHB1bGwgaGduY19zeW1ib2wgYW5kIHJhbmsgYW5kIHVzZSB0aGF0DQp3cml0ZS50YWJsZSh4PWNvcnJlY3RlZF9nX2duWyxjKCJoZ25jX3N5bWJvbCIsICJyYW5rIildLA0KICAgICAgICAgICAgZmlsZT0iQVNYTDFfZ3NlYV9saXN0LnJuayIsc2VwID0gIlx0IiwNCiAgICAgICAgICAgIHJvdy5uYW1lcyA9IEZBTFNFLGNvbC5uYW1lcyA9IEZBTFNFLHF1b3RlID0gRkFMU0UpDQpgYGANCg0KV2UgdGhlbiBmZWVkIHRoaXMgcmVzdWx0IHRvIEdTRUEgYW5kIHJ1biBpdC4NCkkgdXNlZCBHU0VBIDQuMC4zLiBUaGUgZ2VuZXNldCBJIHVzZWQgd2FzIGZyb20gQmFkZXIgbGFiLCBIdW1hbl9HT0JQX0FsbFBhdGh3YXlzX25vX0dPX2llYV9NYXJjaF8wMV8yMDIwLiANCg0KR1NFQSBSZXN1bHRzDQoNCiFbR1NFQSBwYXJhbWV0ZXJzXSguL2EzX2ZpZ3VyZXMvZ3NlYTEucG5nKQ0KDQohW0ZpZ3VyZSAxOiBHU0VBIHJlc3VsdHMsIHVwcmVndWxhdGVkXSguL2EzX2ZpZ3VyZXMvZ3NlYTIucG5nKQ0KDQoNCiFbRmlndXJlIDFBOiBHU0VBIGVucmljaG1lbnQgcGxvdCBmb3IgdG9wIHVwcmVndWxhdGVkIGdlbmUgbGlzdF0oLi9hM19maWd1cmVzL2dzZWEzLnBuZykNCg0KR1NFQSBzZWVtcyB0byBoYXZlIHJlc3VsdHMgdGhhdCBhcmUgZXh0cmVtZWx5IHNpbWlsYXIgdG8gdGhhdCBvZiB0aGUgdGhyZXNob2xkZWQgbGlzdCwgZXhjZXB0IGluc3RlYWQgb2Ygc2VwYXJhdGUgY2F0ZWdvcmllcyBmb3IgZWFjaCBkYXRhIHNvdXJjZSB0aGV5IGFyZSBhbGwgY29tYmluZWQgdG9nZXRoZXIgaW4gb25lIGxpc3QsIGNvbXBhcmVkIHRvIGc6cHJvZmlsZXIuIFNvbWUgY2F0ZWdvcmllcyBhcmUgbW92ZWQgdXAgYW5kIGRvd24sIGJ1dCBpZiBJIGdvIGxvb2tpbmcgZm9yIHNwZWNpZmljIGNhdGVnb3JpZXMgaW4gb25lIGxpc3QgSSB3aWxsIGZpbmQgaXQgc29tZXdoZXJlIGluIHRoZSBvdGhlciByZXN1bHRzIGxpc3QuIFRoaXMgaXMgbm90IGEgc3RyYWlnaHRmb3J3YXJkIGNvbXBhcmlzb24gYmVjYXVzZSBnOnByb2ZpbGVyIGhhcyBzZXBhcmF0ZWQgY2F0ZWdvcmllcyB3aGlsZSBHU0VBIGNvbWJpbmVzIHRoZW0gdG9nZXRoZXIsIGxpa2VseSBkdWUgdG8gZ2VuZXNldCB1c2VkLCBzbyBvdmVyYWxsIHJhbmtpbmcgd2lsbCBiZSBza2V3ZWQgZHVlIHRvIHRoZSBjb21iaW5lZCBsaXN0cy4NCiANCkdTRUEgVG9wIHVwcmVndWxhdGVkIGdlbmUgbGlzdCBkZXRhaWxzDQpgYGB7Un0NCmhlYWQocmVhZC50YWJsZShmaWxlPSIuL2EzX2ZpZ3VyZXMvZ3NlYXRvcFBvcy50eHQiLHNlcCA9ICJcdCIpKQ0KYGBgDQoNCiFbRmlndXJlIDI6IEdTRUEgZW5yaWNobWVudCBwbG90IGZvciB0b3AgZ2VuZSBsaXN0XSguL2EzX2ZpZ3VyZXMvZ3NlYTQucG5nKQ0KDQohW0ZpZ3VyZSAyQTogR1NFQSBlbnJpY2htZW50IHBsb3QgZm9yIHRvcCBkb3ducmVndWxhdGVkIGdlbmUgbGlzdF0oLi9hM19maWd1cmVzL2dzZWE1LnBuZykNCg0KDQojIyMjIDM6IEN5dG9zY2FwZSBFbnJpY2htZW50IE1hcA0KDQpBbiBlbnJpY2htZW50IG1hcCB3YXMgY3JlYXRlZCBpbiBDeXRvc2NhcGUgMy43LjIgdXNpbmcgdGhlIEN5dG9zY2FwZSBleHRlbnNpb24gRW5yaWNobWVudE1hcDMuMzBCZXRhIChsYXRlc3QgcmVsZWFzZSBvbiBnaXRodWIgYXMgb2YgMDQvMDYvMjAyMCkgYXMgd2VsbCBhcyB0aGUgRW5yaWNobWVudE1hcCBQaXBlbGluZSBDb2xsZWN0aW9uIDEuMS4wIChsYXRlc3QgdmVyc2lvbiBpbnN0YWxsYWJsZSBmcm9tIEN5dG9zY2FwZSBhcyBvZiAwNC8wNi8yMDIwKS4NCg0KVGhlIG1hcCB3YXMgY3JlYXRlZCB1c2luZyB0aGUgaW50ZXJmYWNlIHdpdGhpbiBDeXRvc2NhcGUsIG5vdCBmcm9tIEdTRUEuIFNldHRpbmdzIHdlcmUgbGVmdCBhdCBkZWZhdWx0Lg0KRkRSIGN1dG9mZjogMC4xDQpwLXZhbHVlIGN1dG9mZjogMS4wDQpORVM6IEFsbA0KTm90IGZpbHRlcmluZyBieSBtaW5pbXVtIGV4cGVyaW1lbnRzDQpiYWRlcmxhYiBuYW1lcyBwYXJzZWQNCkRhdGEgU2V0IEVkZ2VzIEF1dG9tYXRpYw0KQ3V0b2ZmOiAwLjM3NQ0KTWV0cmljOiBKYWNjYXJkICsgT3ZlcmxhcCBjb21iaW5lZCwgcmF0aW8gNTAvNTANCg0KIVtGaWd1cmUgMzogRW5yaWNobWVudCBNYXBdKC4vYTNfZmlndXJlcy9lbTEucG5nKQ0KDQpUaGVyZSB3ZXJlIDQ5MCBub2RlcyBhbmQgMTk0MSBlZGdlcy4NCg0KVGhlIG5ldHdvcmsgd2FzIGFubm90YXRlZCB1c2luZyB0aGUgQ3l0b3NjYXBlIGV4dGVuc2lvbiBBdXRvQW5ub3RhdGUgMS4zLjINCg0KU2V0dGluZ3Mgd2VyZSBsZWZ0IG1vc3RseSBhdCBkZWZhdWx0Lg0KVXNpbmcgY2x1c3Rlck1ha2VyIEFwcA0KYWxnb3JpdGhtOiBNQ0wgQ2x1c3Rlcg0KZWRnZSB3ZWlnaHQgY29sdW1uOiBzaW1pbGFyaXR5X2NvZWZmaWNpZW50DQorTGF5b3V0IG5ldHdvcmsgdG8gcHJldmVudCBjbHVzdGVyIG92ZXJsYXANCg0KTGFiZWwgY29sdW1uOiBHU19ERVNDUg0KTGFiZWwgQWxnb3JpdGhtOiBXb3JkQ2xvdWQ6IEFkamFjZW50IFdvcmRzIChkZWZhdWx0KQ0KTWF4IHdvcmRzIHBlciBsYWJlbDogMw0KQWRqYWNlbnQgd29yZCBib251czogOA0KRXhjbHVkZWQgV29yZHMgYW5kIERlbGltaXRlcnMgZGVmYXVsdA0KDQohW0ZpZ3VyZSA0aTogRW5yaWNobWVudCBNYXAgbGVnZW5kXSguL2EzX2ZpZ3VyZXMvY3l0b2xlZ2VuZC5wbmcpDQoNCiFbRmlndXJlIDQ6IEVucmljaG1lbnQgTWFwIGFubm90YXRlZCBhbmQgbWFudWFsbHkgYXJyYW5nZWRdKC4vYTNfZmlndXJlcy9lbWFubm90YXRlZC5wbmcpDQoNCiFbRmlndXJlIDU6IENvbGxhcHNlZCBFbnJpY2htZW50IE1hcF0oLi9hM19maWd1cmVzL2VtdGhlbWUucG5nKQ0KDQpEbyB0aGUgZW5yaWNobWVudCByZXN1bHRzIHN1cHBvcnQgY29uY2x1c2lvbnMgb3IgbWVjaGFuaXNtIGRpc2N1c3NlZCBpbiB0aGUgb3JpZ2luYWwgcGFwZXI/IEhvdyBkbyB0aGVzZSByZXN1bHRzIGRpZmZlciBmcm9tIHRoZSByZXN1bHRzIHlvdSBnb3QgZnJvbSBBc3NpZ25tZW50ICMyIHRocmVzaG9sZGVkIG1ldGhvZHM/DQoNClRoZSBHU0VBIHJlc3VsdHMga2luZCBvZiBzdXBwb3J0IHRoZSBjb25jbHVzaW9ucyBhbmQvb3IgbWVjaGFuaXNtIGRpc2N1c3NlZCBpbiB0aGUgb3JpZ2luYWwgcGFwZXIuIEFsdGhvdWdoIG5vdCBpbiB0aGUgdG9wIHJlc3VsdHMsIGdlbmUgbGlzdHMgcmVsYXRpbmcgdG8gbmV1cmFsIGRldmVsb3BtZW50IGFuZCBkaWZmZXJlbnRpYXRpb24gKG5ldXJhbCBjcmVzdCBkaWZmZXJlbnRpYXRpb24sIGhlZGdlaG9nIHNpZ25hbGxpbmcpIHdlcmUgZm91bmQgaW4gdGhlIGRvd25yZWd1bGF0ZWQgZ2VuZSBsaXN0IHNpbWlsYXIgdG8gdGhhdCBpbiB0aGUgdGhyZXNob2xkZWQgbGlzdCBhcHByb2FjaC4gV2UgYWxzbyBzZWUgc3R1ZmYgdmFndWVseSByZWxhdGVkIHRvIG1vYmlsaXR5IGFuZCBjZWxsIGRpdmlzaW9uIGRvd25yZWd1bGF0ZWQgaW4gdGhlIGVucmljaG1lbnQgbWFwIChtaXRvdGljLCBtb3ZlbWVudCwgZXRjKSwgd2hpY2ggd291bGQgc3VwcG9ydCB0aGF0IHBhcnQgb2YgbmV1cmFsIGNyZXN0IGRpZmZlcmVudGlhdGlvbiBpcyBmb3JtYXRpb24gb2YgbmV1cm9zcGhlcmVzIGFuZCBtaWdyYXRpb24uIE1lYW53aGlsZSB0aGUgdXByZWd1bGF0ZWQgbGlzdCBzaG93cyB0aGluZ3Mgc3VjaCBhcyBycm5hIHRyYW5zY3JpcHRzLCBzdHVmZiByZWxhdGVkIHRvIG1pdG9jaG9uZHJpYSBhbmQgdGhlIGVsZWN0cm9uIHRyYW5zcG9ydCBjaGFpbiwgYW5kIGltbXVuZSByZXNwb25zZSwgd2hpY2ggc2VlbXMgbGlrZSB0aGluZ3MgdGhhdCBhIGNlbGwgcmVtYWluaW5nIGluIGludGVycGhhc2Ugd291bGQgcHJpb3JpdGl6ZS4NCg0KIyMjIyA0OiBEYXJrIG1hdHRlciBhbmFseXNpczoNCg0KYGBge1J9DQpsaWJyYXJ5KEdTQSkNCmdtdF9maWxlIDwtIGZpbGUucGF0aChnZXR3ZCgpLCJkYXRhIiwNCiAgICAgICAgICAgICAgICAgICAgIkh1bWFuX0dPQlBfQWxsUGF0aHdheXNfbm9fR09faWVhX0FwcmlsXzAxXzIwMjBfc3ltYm9sLmdtdCIpDQpjYXB0dXJlLm91dHB1dChnZW5lc2V0czwtIEdTQS5yZWFkLmdtdChnbXRfZmlsZSksZmlsZT0iZ3NhX2xvYWQub3V0IikNCm5hbWVzKGdlbmVzZXRzJGdlbmVzZXRzKSA8LSBnZW5lc2V0cyRnZW5lc2V0Lm5hbWVzDQoNCiNleHByZXNzaW9uIGlzIGluIGhnbmNfdGFibGUNCiNyYW5rcyBpcyBjb3JyZWN0ZWRfZ19nblssYygiaGduY19zeW1ib2wiLCAicmFuayIpXQ0KDQojZ2V0IGFsbCB0aGUgR1NFQSBkaXJlY3Rvcmllcw0KDQpnc2VhX2RpcmVjdG9yaWVzIDwtIGxpc3QuZmlsZXMocGF0aCA9IGZpbGUucGF0aChnZXR3ZCgpLCJkYXRhIiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybiA9ICJcXC5Hc2VhUHJlcmFua2VkIikNCmlmKGxlbmd0aChnc2VhX2RpcmVjdG9yaWVzKSA9PSAxKXsNCiAgZ3NlYV9kaXIgPC0gZmlsZS5wYXRoKGdldHdkKCksImRhdGEiLGdzZWFfZGlyZWN0b3JpZXNbMV0pDQogICNnZXQgdGhlIGdzZWEgcmVzdWx0IGZpbGVzDQogIGdzZWFfcmVzdWx0c19maWxlcyA8LSBsaXN0LmZpbGVzKHBhdGggPSBnc2VhX2RpciwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuID0gImdzZWFfcmVwb3J0XyouKi54bHMiKQ0KICAjdGhlcmUgc2hvdWxkIGJlIDIgZ3NlYSByZXN1bHRzIGZpbGVzDQogIGVucl9maWxlMSA8LSByZWFkLnRhYmxlKGZpbGUucGF0aChnc2VhX2Rpcixnc2VhX3Jlc3VsdHNfZmlsZXNbMV0pLCANCiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlciA9IFRSVUUsIHNlcCA9ICJcdCIsIHF1b3RlPSJcIiIsICANCiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSxyb3cubmFtZXM9MSkNCiAgZW5yX2ZpbGUyIDwtIHJlYWQudGFibGUoZmlsZS5wYXRoKGdzZWFfZGlyLGdzZWFfcmVzdWx0c19maWxlc1sxXSksIA0KICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyID0gVFJVRSwgc2VwID0gIlx0IiwgcXVvdGU9IlwiIiwgIA0KICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFLHJvdy5uYW1lcz0xKQ0KfQ0KDQojZ2V0IHRoZSBnZW5lcyBmcm9tIHRoZSBzZXQgb2YgZW5yaWNoZWQgcGF0aHdhc3kgKG5vIG1hdHRlciB3aGF0IHRocmVzaG9sZCkNCmFsbF9lbnJfZ2VuZXNldHM8LSBjKHJvd25hbWVzKGVucl9maWxlMSksIHJvd25hbWVzKGVucl9maWxlMikpDQpnZW5lc19lbnJfZ3MgPC0gYygpDQpmb3IoaSBpbiAxOmxlbmd0aChhbGxfZW5yX2dlbmVzZXRzKSl7DQogIGN1cnJlbnRfZ2VuZXNldCA8LSB1bmxpc3QoZ2VuZXNldHMkZ2VuZXNldHNbd2hpY2goZ2VuZXNldHMkZ2VuZXNldC5uYW1lcyAlaW4lIGFsbF9lbnJfZ2VuZXNldHNbaV0pXSkgDQogIGdlbmVzX2Vucl9ncyA8LSB1bmlvbihnZW5lc19lbnJfZ3MsIGN1cnJlbnRfZ2VuZXNldCkNCn0NCg0KI0ZEUl90aHJlc2hvbGQgPC0gMC4wMDENCiNnZXQgdGhlIGdlbmVzIGZyb20gdGhlIHNldCBvZiBlbnJpY2hlZCBwYXRod2F5IChubyBtYXR0ZXIgd2hhdCB0aHJlc2hvbGQpDQojYWxsX3NpZ19lbnJfZ2VuZXNldHM8LSBjKHJvd25hbWVzKGVucl9maWxlMSlbd2hpY2goZW5yX2ZpbGUxWywiRkRSLnEudmFsIl08PUZEUl90aHJlc2hvbGQpXSwgcm93bmFtZXMoZW5yX2ZpbGUyKVt3aGljaChlbnJfZmlsZTJbLCJGRFIucS52YWwiXTw9RkRSX3RocmVzaG9sZCldKQ0KI2dlbmVzX3NpZ19lbnJfZ3MgPC0gYygpDQojZm9yKGkgaW4gMTpsZW5ndGgoYWxsX3NpZ19lbnJfZ2VuZXNldHMpKXsNCiMgIGN1cnJlbnRfZ2VuZXNldCA8LSB1bmxpc3QoZ2VuZXNldHMkZ2VuZXNldHNbd2hpY2goZ2VuZXNldHMkZ2VuZXNldC5uYW1lcyAlaW4lIGFsbF9zaWdfZW5yX2dlbmVzZXRzW2ldKV0pIA0KIyAgZ2VuZXNfc2lnX2Vucl9ncyA8LSB1bmlvbihnZW5lc19zaWdfZW5yX2dzLCBjdXJyZW50X2dlbmVzZXQpDQojfQ0KDQpnZW5lc19hbGxfZ3MgPC0gdW5pcXVlKHVubGlzdChnZW5lc2V0cyRnZW5lc2V0cykpDQoNCmdlbmVzX25vX2Fubm90YXRpb24gPC0gc2V0ZGlmZihoZ25jX3RhYmxlWywyXSwgZ2VuZXNfYWxsX2dzKQ0KDQpyYW5rcyA8LSBjb3JyZWN0ZWRfZ19nblssYygiaGduY19zeW1ib2wiLCAicmFuayIpXQ0KDQpyYW5rZWRfZ2VuZV9ub19hbm5vdGF0aW9uIDwtIHJhbmtzW3doaWNoKHJhbmtzWywxXSAlaW4lIGdlbmVzX25vX2Fubm90YXRpb24pLF0NCg0KaGVhZChyYW5rZWRfZ2VuZV9ub19hbm5vdGF0aW9uKQ0KDQpnZW5lc19ub19lbnJfYW5ub3RhdGlvbiA8LSBzZXRkaWZmKGhnbmNfdGFibGVbLDJdLCBnZW5lc19zaWdfZW5yX2dzKQ0KDQpyYW5rZWRfZ2VuZV9ub19lbnJfYW5ub3RhdGlvbiA8LSByYW5rc1t3aGljaChyYW5rc1ssMV0gJWluJSBnZW5lc19ub19lbnJfYW5ub3RhdGlvbiksXQ0KDQpoZWFkKHJhbmtlZF9nZW5lX25vX2Vucl9hbm5vdGF0aW9uKQ0KDQoNCmBgYA0KDQoNCmBgYHtSfQ0KI2hlYXRtYXAgZm9yIGFueSBzaWduaWZpY2FudCBnZW5lcyB0aGF0IGFyZSBub3QgYW5ub3RhdGVkIHRvIGFueSBvZiB0aGUgcGF0aHdheXMgcmV0dXJuZWQgaW4gdGhlIGVucmljaG1lbnQgYW5hbHlzaXMNCmhlYXRtYXBfbWF0cml4X3RvcGhpdHMgPC0gdCgNCiAgc2NhbGUodChmaW5hbF9hMV9kYXRhW3doaWNoKHJvd25hbWVzKGZpbmFsX2ExX2RhdGEpICVpbiUgcmFua2VkX2dlbmVfbm9fZW5yX2Fubm90YXRpb25bLDFdKSxdKSkpDQppZihtaW4oaGVhdG1hcF9tYXRyaXhfdG9waGl0cykgPT0gMCl7DQogICAgaGVhdG1hcF9jb2wgPSBjb2xvclJhbXAyKGMoIDAsIG1heChoZWF0bWFwX21hdHJpeF90b3BoaXRzKSksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKCAid2hpdGUiLCAicmVkIikpDQogIH0gZWxzZSB7DQogICAgaGVhdG1hcF9jb2wgPSBjb2xvclJhbXAyKGMobWluKGhlYXRtYXBfbWF0cml4X3RvcGhpdHMpLCAwLCBtYXgoaGVhdG1hcF9tYXRyaXhfdG9waGl0cykpLCBjKCJibHVlIiwgIndoaXRlIiwgInJlZCIpKQ0KICB9DQpjdXJyZW50X2hlYXRtYXAgPC0gSGVhdG1hcChhcy5tYXRyaXgoaGVhdG1hcF9tYXRyaXhfdG9waGl0cyksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBjbHVzdGVyX3Jvd3MgPSBUUlVFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgY2x1c3Rlcl9jb2x1bW5zID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93X3Jvd19kZW5kID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93X2NvbHVtbl9kZW5kID0gVFJVRSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sPWhlYXRtYXBfY29sLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dfY29sdW1uX25hbWVzID0gVFJVRSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd19yb3dfbmFtZXMgPSBGQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93X2hlYXRtYXBfbGVnZW5kID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApDQpjdXJyZW50X2hlYXRtYXANCmBgYA0KDQpgYGB7Un0NCiNoZWF0bWFwIG9mIGFueSBzaWduaWZpY2FudCBnZW5lcyB0aGF0IGFyZSBub3QgYW5ub3RhdGVkIHRvIGFueSBwYXRod2F5cyBpbiBlbnRpcmUgc2V0IG9mIHBhdGh3YXlzIHVzZWQgZm9yIHRoZSBhbmFseXNpcy4NCmhlYXRtYXBfbWF0cml4X3RvcGhpdHMgPC0gdCgNCiAgc2NhbGUodChmaW5hbF9hMV9kYXRhW3doaWNoKHJvd25hbWVzKGZpbmFsX2ExX2RhdGEpICVpbiUgcmFua2VkX2dlbmVfbm9fYW5ub3RhdGlvblssMV0pLF0pKSkNCmlmKG1pbihoZWF0bWFwX21hdHJpeF90b3BoaXRzKSA9PSAwKXsNCiAgICBoZWF0bWFwX2NvbCA9IGNvbG9yUmFtcDIoYyggMCwgbWF4KGhlYXRtYXBfbWF0cml4X3RvcGhpdHMpKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMoICJ3aGl0ZSIsICJyZWQiKSkNCiAgfSBlbHNlIHsNCiAgICBoZWF0bWFwX2NvbCA9IGNvbG9yUmFtcDIoYyhtaW4oaGVhdG1hcF9tYXRyaXhfdG9waGl0cyksIDAsIG1heChoZWF0bWFwX21hdHJpeF90b3BoaXRzKSksIGMoImJsdWUiLCAid2hpdGUiLCAicmVkIikpDQogIH0NCmN1cnJlbnRfaGVhdG1hcCA8LSBIZWF0bWFwKGFzLm1hdHJpeChoZWF0bWFwX21hdHJpeF90b3BoaXRzKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJfcm93cyA9IFRSVUUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBjbHVzdGVyX2NvbHVtbnMgPSBUUlVFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dfcm93X2RlbmQgPSBUUlVFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dfY29sdW1uX2RlbmQgPSBUUlVFLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2w9aGVhdG1hcF9jb2wsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd19jb2x1bW5fbmFtZXMgPSBUUlVFLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93X3Jvd19uYW1lcyA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dfaGVhdG1hcF9sZWdlbmQgPSBUUlVFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCmN1cnJlbnRfaGVhdG1hcA0KYGBgDQoNClN0cmFuZ2VseSBpbiB0aGUgZGFyayBtYXR0ZXIgaGVhdG1hcHMgV1QgMiBkb2VzIG5vdCBjbHVzdGVyIHdpdGggV1QzIGFuZCBXVDEsIGJ1dCB0aGV5IGFsc28gZG9uJ3QgcGFydGljdWxhcmx5IGNsdXN0ZXIgd2VsbCB3aXRoIHRoZSBIT00gZ3JvdXAgYXMgd2VsbC4gQ2VydGFpbmx5IHRoZSBkYXJrIG1hdHRlciBoYXMgbW9yZSBub2lzZSB0aGFuIHRoZSBnZW5lcyByZXByZXNlbnRlZCBpbiB0aGUgZ2VuZSBzZXRzLg0KDQojIyMjIFJlZmVyZW5jZXMNCg==